package br.ufrj.dcc.ad.systems;

import java.util.Stack;

import br.ufrj.dcc.ad.generators.TimeGenerator;

public class Lifo extends Fila{
	/**
	 * Inicializa uma fila com politica de atendimento LIFO.
	 * @param geradorServico Gerador de tempos de serviço desta fila.
	 */
	public Lifo(TimeGenerator geradorServico){
		super(geradorServico);
		this.clientes = new Stack<Cliente>();
	}
	@Override
	public void add(Cliente cliente) {
		Stack<Cliente> lifo = (Stack<Cliente>)clientes;
		lifo.add(cliente);
	}

	@Override
	public void remove(Cliente cliente) {
		Stack<Cliente> lifo = (Stack<Cliente>)clientes;
		lifo.remove(cliente);
	}

	@Override
	public void reenter(Cliente cliente) {
		Stack<Cliente> filaNova = new Stack<Cliente>();
		Stack<Cliente> filaAntiga = (Stack<Cliente>) clientes;
		filaNova.addAll(filaAntiga);
		if(!filaAntiga.contains(cliente)){
			filaNova.add(cliente);
		}
		clientes = filaNova; 
	}
	
	@Override
	public void interruptReenter(Cliente cliente) {
		if(!clientes.contains(cliente)){
			add(cliente);
		}
	}
	
	@Override
	public Cliente getAndRemoveNext() {
		return ((Stack<Cliente>)clientes).pop();
	}

	@Override
	public Cliente seeNext() {
		return ((Stack<Cliente>)clientes).peek();
	}
	@Override
	public Cliente lessPriority(Cliente cliente1, Cliente cliente2) {
		if(cliente1.getNome().compareTo(cliente2.getNome()) > 0){
			return cliente2;
		}
		return cliente1;
	}
}
